home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Personal Computer World 2005 October
/
PCWOCT05.iso
/
Software
/
FromTheMag
/
XAMPP 1.4.14
/
xampp-win32-1.4.14-installer.exe
/
xampp
/
php
/
pear
/
DB
/
ado.php
< prev
next >
Wrap
PHP Script
|
2004-03-24
|
42KB
|
1,448 lines
<?php
//
// +----------------------------------------------------------------------+
// | PHP Version 4 |
// +----------------------------------------------------------------------+
// | Copyright (c) 1997-2003 The PHP Group |
// +----------------------------------------------------------------------+
// | This source file is subject to version 2.02 of the PHP license, |
// | that is bundled with this package in the file LICENSE, and is |
// | available at through the world-wide-web at |
// | http://www.php.net/license/2_02.txt. |
// | If you did not receive a copy of the PHP license and are unable to |
// | obtain it through the world-wide-web, please send a note to |
// | license@php.net so we can mail you a copy immediately. |
// +----------------------------------------------------------------------+
// | Author: Alexios Fakos (alexios@php.net) |
// +----------------------------------------------------------------------+
//
// $Id: ado.php,v 1.3 2003/01/04 11:54:52 mj Exp $
//
//
// Example:
//
// $dsn = array(
// "phptype" => "ado",
// "dbsyntax" => "access", // "mssql" or "odbc"
// "username" => "Admin",
// "password" => "",
// "database" => "Provider=Microsoft.Jet.OLEDB.4.0;
// Data Source=C:\\Programs\\Microsoft Office\\Office\\Samples\\Nordwind.mdb;
// Persist Security Info=False"
// );
//
// $conn = DB::connect($dsn);
//
// ....
/**
* Database independent query interface definition for Microsoft's ADODB
* library using PHP's COM extension
*
* @author Alexios Fakos <alexios@php.net>
* @version $Revision: 1.3 $
* @package DB_ado
*/
include_once(dirname(__FILE__) . '/ado_constants.php');
require_once ('DB/common.php');
class DB_ado extends DB_common
{
/**
* Points on ADODB.Connection
*
* @var object ADODB.Connection (COM)
* @see connect(), simpleQuery(), disconnect()
*/
var $connection;
/**
* Database backend used in PHP (mysql, odbc etc.)
*
* @var string
* @see connect(), toString()
*/
var $phptype;
/**
* Database used with regards to SQL syntax etc.
*
* @var string
* @todo defining special OLEDB-Provider (mssql, access, odbc)
* @see connect(), createSequence(), toString()
*/
var $dbsyntax;
/**
* Flag for method commit(), default no commit on every query
*
* @var boolean default true
* @see autoCommit(), adoTrans(), commit(), rollback()
*/
var $autocommit = true;
/**
* Flag to see how often a commit was started, Default no commit
* on every query
*
* @var boolean default true
* @see autoCommit(), simpleQuery(), rollback()
*/
var $transaction_opcount = 0; // flag
/**
* Result of affected rows
*
* @var variant
* @see affectedRows(), simpleQuery()
*/
var $affected;
/**
* Points on ADODB.Recordset
*
* @var object ADODB.Recordset (COM)
* @see simpleQuery(), disconnect()
*/
var $recordset;
/**
* Specific max records to be retreived on execution.
*
* Default value 0 stays for return all records.
*
* @var integer default 0
* @see setMaxRecords()
*/
var $_max_records = 0;
/**
* Specific option for ADODB.Connection and ADODB.Recordset.
*
* Valid values are: -1 || 1 || 2 || 4 || 8 || 256 || 512
*
* @var integer default -1
* @see setExecuteOption()
*/
var $_execute_option = -1;
/**
* Specific cursor location.
*
* Valid values are: 2 || 3
*
* @var integer default 2
* @see setCursorLocation()
*/
var $_cursor_location = adUseClient; // 3;
/**
* Specific cursor type.
*
* Valid values are: -1 || 0 || 1 || 2 || 3
*
* @var integer default 3
* @see setCursorType()
*/
var $_cursor_type = adOpenStatic; //3;
/**
* Specific lock type.
*
* Valid values are: -1 || 0 || 1 || 2 || 3 || 4
*
* @var integer default -1
* @see setLockType()
*/
var $_lock_type = -1;
////////////////////////////////////////////// ///////////////////////////
////////////////////////////////////////////// ///////////////////////////
/**
* DB_ado constructor.
* Visit
* http://support.microsoft.com/default.aspx?scid=kb;EN-US;q168354
* for $errorcode_map
*
* @access public
* @return void
* @see DB::common(), $dbsyntax, $phptype
*/
function DB_ado()
{
$this->DB_common();
$this->phptype = 'ado';
$this->dbsyntax = 'ado';
$this->features = array(
'prepare' => false,
'pconnect' => false,
'transactions' => true,
'limit' => 'alter'
);
$this->errorcode_map = array(
-2147483647 => DB_ERROR_UNSUPPORTED,
-2147467263 => DB_ERROR_UNSUPPORTED,
-2147467259 => DB_ERROR_UNSUPPORTED,
-2147217865 => DB_ERROR_NOSUCHTABLE,
-2147217900 => DB_ERROR_NOSUCHFIELD,
2147749392 => DB_ERROR_NOSUCHFIELD,
-2147217857 => DB_ERROR_ALREADY_EXISTS,
-2147217843 => DB_ERROR_CONNECT_FAILED
);
$this->affected = new VARIANT();
}
/**
* DB_ado destructor.
*
* @since 1.0
* @access private
* @return void
* @see disconnect()
*/
function _DB_ado()
{
$this->disconnect();
}
/**
* Connect to a database and log in as the specified user.
*
* @param $dsn the data source name (see DB::parseDSN for syntax)
* @param $persistent (optional) whether the connection should be
* persistent (actually not supported persistent
* COM objects in php)
* @access public
* @throws DB_Error
* @return mixed DB_OK on success or DB_Error on failure
* @see adoIsError(), adoRaiseError(), raiseError()
*/
function connect($dsninfo, $persistent = false)
{
if (!OS_WINDOWS) {
return $this->raiseError(DB_ERROR_EXTENSION_NOT_FOUND, null,
null, null, 'This class runs only on Windows OS');
}
$this->dsn = $dsninfo;
$this->dbsyntax = (string) strtolower(trim($dsninfo['dbsyntax']));
$connstr = (string) $dsninfo['database'];
$user = (string) $dsninfo['username'];
$pw = (string) $dsninfo['password'];
$this->connection = new COM("ADODB.Connection");
if (!$this->connection) {
$errMsg = 'Could not create an instance of ADODB.Connection.\n';
$errMsg .= 'Check if you have installed MDAC on your machine.\n';
$errMsg .= 'Take a look at ';
$errMsg .= 'http://www.microsoft.com/data/download.htm';
return $this->raiseError(DB_ERROR_CONNECT_FAILED, null,
null, null, $errMsg);
}
//check some valid link properties
$link = 'PROVIDER=|DRIVER=|DATA+SOURCE=|PERSIST+SECURITY+INFO=|UID=|';
$link .= 'USER+ID=|PASSWORD=|PWD=|INITIAL+CATALOG=';
if (!empty($connstr) && preg_match('/\b\s*('.$link.')\b/i', $connstr)) {
@$this->connection->Open($connstr, $user, $pw);
if (!$this->connection || $this->adoIsError()) {
return $this->adoRaiseErrorEx(DB_ERROR_CONNECT_FAILED);
}
} else {
return $this->adoRaiseErrorEx(DB_ERROR_INVALID_DSN);
}
return DB_OK;
}
/**
* Close ADODB.Recordset, ADODB.Connection and delete vars to free memory.
*
* @access public
* @return boolean always TRUE
* @see $connection, $recordset
*/
function disconnect()
{
if (is_object($this->recordset)) {
if (@$this->recordset->State != adStateClosed) {
@$this->recordset->Close();
}
}
if (is_object($this->connection) &&
@$this->connection->State != adStateClosed) {
@$this->connection->Close();
}
$this->recordset = null;
$this->connection = null;
return true;
}
/**
* Sending a query through ADODB.Connection and recieve ADO.Recordset
* as result.
* For manip queries we use ADODB.Connection execute method instead of
* ADO.Recordset open method.
*
* @param string $query sql statement
* @access public
* @throws DB_Error
* @return mixed object ADODB.Recordset or DB_Error on failure
* @see $connection, $recordset, $_max_records, $_cursor_type,
* $_lock_type, $_execute_option, $transaction_opcount,
* adoTrans(), commit()
*/
function simpleQuery($query)
{
$ismanip = DB::isManip($query);
$this->last_query = $query;
$query = $this->modifyQuery($query);
if (!$this->autocommit && $ismanip) {
// transaction supported?
if ($this->adoTrans()) {
$this->transaction_opcount++;
}
}
if ($ismanip) {
$this->recordset = @$this->connection->Execute($query,
&$this->affected,
$this->_execute_option);
} else {
if (!is_object($this->recordset)) {
$this->recordset = new COM('ADODB.Recordset');
if (!$this->recordset) {
$errMsg = 'Creating an instance of ADODB.Recordset ';
$errMsg .= 'failed!';
return $this->raiseError(DB_ERROR_EXTENSION_NOT_FOUND,
null, null, null, $errMsg);
}
} else {
// close other open recordset to open a new one
if ($this->recordset->State != adStateClosed) {
@$this->recordset->Close();
}
}
$this->recordset->MaxRecords = $this->_max_records;
@$this->recordset->Open ($query, $this->connection, $this->_cursor_type,
$this->_lock_type, $this->_execute_option);
}
if ($this->adoIsError()) {
return $this->adoRaiseErrorEx($this->errorNative());
}
return $this->recordset;
}
/**
* Move the internal ADODB.Recordset result pointer to the next
* available result.
*
* @param object (reference) ADODB.Recordset
* @access public
* @return void
*/
function nextResult($result)
{
if (!@$result->EOF()) {
@$result->MoveNext();
}
}
/**
* Fetch and return a row of current ADODB.Recordset.
* Internally we do some important transformations for right php
* result.
* Take a look at ADODB.DataTypeEnum for details.
*
* @param object $result ADODB.Recordset
* @param array $arr (reference) where data from the row is stored
* @param integer $fetchmode how the array data should be indexed
* @param integer $rownum the row number to fetch
* @access public
* @return mixed DB_OK on success, NULL on no more rows
* @todo BINARY DATA handling
*/
function fetchInto($result, &$arr, $fetchmode, $rownum=null)
{
if ($rownum !== null && !@$result->EOF()) {
$this->pushErrorHandling(PEAR_ERROR_RETURN);
// adBookmarkFirst, start at the first record
@$result->Move($rownum, 1);
$this->popErrorHandling();
if ($this->adoIsError()) {
return $this->adoRaiseErrorEx();
}
}
if (@$result->EOF()) {
return null;
}
$arr = array();
$count = $this->numCols($result);
for($i = 0; $i < $count; $i++) {
$field = $result->Fields($i);
$type = $field->Type;
$fvalue = $field->Value;
// avoiding 1970-01-01 01:00:00 on date values if
// $fvalue is null or < 0
$value = null;
if ($fvalue !== null) {
// adCurrency == 6
if ($this->isTypeOfCurrency($type)) {
$value = (float) $fvalue;
// adDate == 7 + adDBDate DBTYPE_DBDATE == 133
} elseif ($this->isTypeOfDate($type)) {
if ($fvalue > 0) {
$value = date('Y-m-d', (integer) $fvalue);
}
// adDBTime DBTYPE_DBTIME == 134
} elseif ($this->isTypeOfTime($type)) {
if ($fvalue > 0) {
$value = date('H:i:s', (integer) $fvalue);
}
// adDBTimeStamp DBTYPE_DBTIMESTAMP == 135
} elseif ($this->isTypeOfTimestamp($type)) {
if ($fvalue > 0) {
$value = date('Y-m-d H:i:s', (integer) $fvalue);
}
} elseif ($this->isTypeOfBinary($type)) {
if (is_array($fvalue)) {
$value = '';
foreach ($fvalue as $value) {
$value .= pack('C', $value);
}
$fvalue = null;
} else {
$value = $fvalue;
}
} else {
$value = $fvalue;
}
}
if ($fetchmode !== DB_FETCHMODE_ASSOC) {
$arr[] = $value;
} else {
$arr[$field->Name] = $value;
}
}
@$result->MoveNext();
$field = null;
unset($field);
return DB_OK;
}
/**
* Get the number of columns in a recordset.
*
* @since 1.0
* @param object $result ADODB.Recordset
* @access public
* @return integer the number of columns per row in $result
*/
function numCols($result)
{
$cols = -1;
if (is_object($result)) {
$cols = @$result->Fields->Count();
}
return ($cols !== -1) ? $cols : 0;
}
/**
* Get the number of rows in a ADODB.Recordset.
* Note: If cursor type supports does not support RecordCount,
* the result is always adUnknown = -1.
*
* @since 1.0
* @param object $result ADODB.Recordset
* @access public
* @return integer number of rows in ADODB.Recordset
* @see setCursorType()
*/
function numRows($result)
{
$count = -1;
if (is_object($result)) {
$count = @$result->RecordCount();
}
return ($count !== -1) ? $count : 0;
}
/**
* Gets the number of rows affected by the last manip query.
*
* @since 1.0
* @access public
* @return integer number of rows affected by the last query
* @see $affected
*/
function affectedRows()
{
return $this->affected->value;
}
/**
* Get the next value in a sequence. Depends on $dbsyntax which type
* we use
*
* @access public
* @param $seq_name the name of the sequence
* @param $ondemand whether to create the sequence table on
* demand (default is true)
* @return mixed a sequence integer or DB_Error
*/
function nextId($seq_name, $ondemand = true)
{
$sqn = preg_replace('/[^a-z0-9_]/i', '_', $seq_name);
$repeat = 0;
do {
$this->pushErrorHandling(PEAR_ERROR_RETURN);
$rs = $this->query("UPDATE ${sqn}_seq SET id = id + 1");
$this->popErrorHandling();
if ($ondemand && DB::isError($rs) &&
$this->errorCode($rs->getCode()) == DB_ERROR_NOSUCHTABLE) {
$repeat = 1;
$rs = $this->createSequence($seq_name);
} else {
$rs = $this->getOne("SELECT MAX(id) FROM ${sqn}_seq");
$repeat = 0;
}
} while ($repeat);
if (DB::isError($rs)) {
return $this->raiseError($result);
}
return $rs;
}
// }}}
// {{{ createSequence()
function createSequence($seq_name)
{
$sqn = preg_replace('/[^a-z0-9_]/i', '_', $seq_name);
if ($this->_tableExists("${sqn}_seq")) {
return DB_OK;
}
$ftype = $this->_helpCreateSequence();
$rs = $this->query("CREATE TABLE ${sqn}_seq " . $ftype);
if (DB::isError($rs)) {
return $rs;
}
$rs = $this->query("INSERT INTO ${sqn}_seq (id) VALUES(0)");
return $rs;
}
// }}}
// {{{ dropSequence()
function dropSequence($seq_name)
{
$sqn = preg_replace('/[^a-z0-9_]/i', '_', $seq_name);
// close recordset first to avoid table is locked
if (@$this->recordset->State != 0) {
@$this->recordset->Close();
}
return $this->query("DROP TABLE ${sqn}_seq");
}
/**
* Free the internal resources associated with $result
* (basicly it means close recordset)
*
* @since 1.0
* @param object $result ADODB.Recordset
* @return boolean always TRUE
*/
function freeResult($result)
{
if (@$result->State != 0) {
@$result->Close();
}
$this->affected->value = 0;
$this->transaction_opcount = 0;
return true;
}
/**
* Enable automatic commit.
*
* @param boolean $onoff (optional) default false
* @return boolean always TRUE
* @access public
* @see $autocommit
*/
function autoCommit($onoff = false)
{
$this->autocommit = $onoff ? true : false;
return DB_OK;
}
/**
* Checking of transaction support by OLEDB-Provider.
* Normally the startpoint of an transaction will be set here
*
* @param boolean $onoff
* @return mixed TRUE on success, FALSE if transaction is not
* supported
* @throws DB_Error
* @access public
* @see $autocommit, $transaction_opcount
*/
function adoTrans()
{
$ret = $this->connection->Properties('Transaction DDL');
if (!$ret) {
return false;
} else {
$ret = null;
unset($ret);
if ($this->transaction_opcount == 0) {
@$this->connection->BeginTrans();
if ($this->adoIsError()) {
return $this->adoRaiseErrorEx();
}
}
}
return DB_OK;
}
/**
* Starts a commit
*
* @param none
* @return boolean TRUE on success
* @throws DB_Error
* @access public
* @see $autoCommit()
*/
function commit()
{
if ($this->transaction_opcount > 0) {
@$this->connection->CommitTrans();
if ($this->adoIsError()) {
return $this->adoRaiseErrorEx();
}
$this->transaction_opcount = 0;
}
return DB_OK;
}
/**
* Starts a rollback
*
* @param none
* @return boolean TRUE on success
* @throws DB_Error
* @access public
* @see $autoCommit()
*/
function rollback()
{
if ($this->transaction_opcount > 0) {
@$this->connection->RollbackTrans();
if ($this->adoIsError()) {
return $this->adoRaiseErrorEx();
}
$this->transaction_opcount = 0;
}
return DB_OK;
}
/**
* Get the extended error collection of the current ADODB.Connection
*
* @since 1.0
* @access public
* @return string ADODB.Error
*/
function errorNativeEx()
{
$errors = $this->connection->Errors();
if ($errors->Count() == 0) {
return DB_ERROR_NOT_CAPABLE;
}
$count = $errors->Count();
$ret = '';
for($i = 0; $i < $count; $i++) {
$item = $errors->Item($i);
$msg = $item->Description;
$native = $item->NativeError;
$nr = $item->Number;
$source = $item->Source;
$sql = $item->SQLState;
$ret .= "Source: $source - Description: $msg - SQLState: ";
$ret .= "$sql - Number: $nr - Native: $native \n";
}
$item = null;
unset($item);
$errors = null;
unset($errors);
return $ret;
}
/**
* Get the native error code of the last error (if any) that
* occured on the current ADODB.Connection
*
* @since 1.0
* @access public
* @return string ADODB.Error
*/
function errorNative()
{
$errors = $this->connection->Errors();
if ($errors->Count() == 0) {
return DB_ERROR_NOT_CAPABLE;
}
$item = $errors->Item(0);
$ret = (int) $item->Number;
$item = null;
unset($item);
$errors = null;
unset($errors);
return $ret;
}
/**
* Raise an error and set as param nativecode on raiseError()
* result-string of errorNative()
*
* @param integer $errno (optional) default null
* @since 1.0
* @access public
* @return void
* @see errorNative(), raiseError()
*/
function adoRaiseError($errno = null)
{
return $this->raiseError($errno, null, null, null,
$this->errorNative());
}
/**
* Raise an error and set as param nativecode on raiseError()
* result-string of errorNative()
*
* @param integer $errno (optional) default null
* @since 1.0
* @access public
* @return void
* @see errorNativeEx(), raiseError()
*/
function adoRaiseErrorEx($errno = null)
{
if ($errno === null) {
$errno = $this->errorCode($errno);
}
return $this->raiseError($errno, null, null, null,
$this->errorNativeEx());
}
/**
* Checking if an ADODB.Connection error occured
*
* @param none
* @since 1.0
* @access public
* @return boolean TRUE error(s) occured,
* FALSE no error occured
*/
function adoIsError()
{
if ($this->connection->Errors->Count() > 0 &&
is_object($this->connection)) {
return true;
}
return false;
}
/**
* Set execute option for ADODB.Connection. Only for manip queries.
*
* CommandTypeEnum
* adCmdText = 1
* adCmdTable = 2
* adCmdStoredProc = 4
* adCmdUnknown = 8
* adCmdFile = 256
* adCmdTableDirect = 512
*
* @param integer $value (optional) default -1
* @since 1.0
* @access public
* @return boolean TRUE we set the $value, FALSE wrong Enum was
* given
* @see $_execute_option
*/
function setExecuteOption($value = -1)
{
if ($value > 0 && $value < 3) {
} elseif ($value == -1) {
} elseif ($value == 4) {
} elseif ($value == 8) {
} elseif ($value == 256) {
} elseif ($value == 512) {
} else {
return false;
}
$this->_execute_option = $value;
return true;
}
/**
* Set the cursor type for ADODB.Recordset.
* Only for catching records.
*
* Notes:
* Use adOpenKeyset = 1 or adOpenstatic = 3 to get a
* value > 0 of numRows().
*
* CursorTypeEnum
* adOpenUnspecified = -1
* adOpenForwardOnly = 0
* adOpenKeyset = 1
* adOpenDynamic = 2
* adOpenStatic = 3
*
* @param integer $value (optional) default -1
* @since 1.0
* @access public
* @return boolean TRUE we set the $value,
* FALSE wrong Enum was given
* @see numRows(), $_cursor_type
*/
function setCursorType($value = -1)
{
if ($value >= 0 || $value < 4) {
$this->_cursor_type = $value;
return true;
}
return false;
}
/**
* Set the cursor location for ADODB.Connection
*
* CursorLocationEnum
* adUseServer = 2
* adUseClient = 3
*
* @param integer $value (optional) default 3
* @since 1.0
* @access public
* @return boolean TRUE we set the $value,
* FALSE wrong Enum was given
* @see $_cursor_location
*/
function setCursorLocation($value = 3)
{
if ($value > 1 && $value < 4) {
$this->_cursor_location = $value;
return true;
}
return false;
}
/**
* Set the lock type for ADODB.Recordset. Only for catching records.
*
* LockTypeEnum
* adLockUnspecified = -1
* adLockReadOnly = 1
* adLockPessimistic = 2
* adLockOptimistic = 3
* adLockBatchOptimistic = 4
*
* @param integer $value (optional) default -1
* @since 1.0
* @access public
* @return boolean TRUE we set the $value,
* FALSE wrong Enum was given
* @see $_lock_type
*/
function setLockType($value = -1)
{
if ($value > 0 || $value < 5) {
$this->_lock_type = $value;
return true;
}
return false;
}
/**
* Setting of MaxRecords to get only xx records on every query
*
* Note: msdn-article (Q186267)
* "PRB: MaxRecords Property Is Not Used in Access Queries with ADO"
*
* @param integer $value (optional) default 0
* @since 1.0
* @access public
* @return boolean TRUE we set the $value,
* FALSE no integer value was given
* @see $_max_records
*/
function setMaxRecords($value = 0)
{
if (is_int($value)) {
$this->_max_records = $value;
return true;
}
return false;
}
/**
* Help function to get string of field declaration
*
* @return string fieldtype and conditions
* @see createSequence()
*/
function _helpCreateSequence()
{
$dbsyntax = strtolower($this->dbsyntax);
if ($dbsyntax == 'access') {
$ftype = '(id LONG NOT NULL, PRIMARY KEY(id))';
} else {
// odbc compliant
$ftype = '(id BIGINT NOT NULL, PRIMARY KEY(id))';
}
return $ftype;
}
/**
* Help function to know if table exists
*
* param string $value tablename
* @return boolean TRUE table exists, FALSE table does not exist
* @see createSequence()
*/
function _tableExists($value)
{
$ok = false;
$cat = new COM('ADOX.Catalog');
if ($cat) {
// @$cat->ActiveConnection = $this->connection;
// can use it in this way, i get always a seq fault of php.exe,
// maybe a bug reported bug-id #16720
// so we use an alternative way ...
@$cat->ActiveConnection = $this->connection->ConnectionString;
$tables = @$cat->Tables;
$count = $tables->Count();
for($i = 0; $i < $count; $i++) {
$table = $tables->Item($i);
if (strtolower($table->Type) != 'view' &&
strtolower($table->Name) == $value) {
$ok = true;
break;
}
}
$table = null;
unset($table);
$tables = null;
unset($tables);
$cat = null;
unset($cat);
}
return $ok;
}
// }}}
// {{{ tableInfo()
function tableInfo($result, $mode = null) {
$count = 0;
$id = 0;
$res = array();
// if $result is a string, then we want information about a
// table without a resultset
if (is_string($result)) {
$table_name = $result;
} else { // is_object
$sql = $this->last_query;
$table_name = strtolower($this->_getTableNameFromSQL($sql));
// or @$result->Source
if (empty($table_name)) {
return $this->raiseError(DB_ERROR_INVALID, null, null,
null, 'Empty table name in tableInfo() ' . __LINE__);
}
}
$cat = new COM('ADOX.Catalog');
if ($cat) {
@$cat->ActiveConnection = $this->connection->ConnectionString;
$tables = @$cat->Tables;
$count = $tables->Count();
if (!empty($mode)) {
$res['num_fields']= $count;
}
for($i = 0; $i < $count; $i++) {
$table = $tables->Item($i);
if (strtolower($table->Type) != 'view' &&
strtolower($table->Name) == $table_name) {
for($x = 0; $x < $table->Columns->Count(); $x++) {
$column = $table->Columns->Item($x);
$res[$x]['table']= (string) @$table->Name;
$res[$x]['name'] = (string) @$column->Name;
$type = $this->_getStringOfADOType($column->Type);
$res[$x]['type'] = (string) $type;
$res[$x]['len'] = (string) @$column->DefinedSize;
$flags = $this->_getFlags4TableInfo($column);
$res[$x]['flags']= (string) $flags;
if (!empty($mode)) {
if ($mode & DB_TABLEINFO_ORDER) {
$res['order'][$res[$x]['name']] = $x;
}
if ($mode & DB_TABLEINFO_ORDERTABLE) {
$res['ordertable'][$res[$x]['table']][$res[$x]['name']] = $x;
}
}
}
break;
} // $table_name
}
} // !$cat
$column = null;
unset($column);
$table = null;
unset($table);
$tables = null;
unset($tables);
$cat = null;
unset($cat);
return $res;
}
// todo: transforming ret int-value to string
/**
* Get MS ADODB integer value of field type
* as human string
*
* @param string $value integer value of ADODB field type
* @access privat
* @return string human string
*/
function _getStringOfADOType($value)
{
$ret = 'char';
if ($this->isTypeOfBinary($value)) {
$ret = 'binary';
} elseif ($this->isTypeOfBit($value)) {
$ret = 'bit';
} elseif ($this->isTypeOfDecimal($value)) {
$ret = 'decimal';
} elseif ($this->isTypeOfNumeric($value)) {
$ret = 'numeric';
} elseif ($this->isTypeOfDouble($value)) {
$ret = 'double';
} elseif ($this->isTypeOfFloat($value)) {
$ret = 'float';
} elseif ($this->isTypeOfReal($value)) {
$ret = 'real';
} elseif ($this->isTypeOfCurrency($value)) {
$ret = 'currency';
} elseif ($this->isTypeOfInteger($value)) {
$ret = 'int';
} elseif ($this->isTypeOfTime($value)) {
$ret = 'datetime';
} elseif ($this->isTypeOfTimestamp($value)) {
$ret = 'timestamp';
} elseif ($this->isTypeOfDate($value)) {
$ret = 'date';
}
return $ret;
}
/**
* Receiving of the table name in a SQL query string
*
* @param string $value SQL query string
* @access privat
* @return string table name in the SQL query
*/
function _getTableNameFromSQL($value)
{
$sql = ltrim($value);
$from_part = stristr($sql, 'from');
$from_array = split(' ', $from_part);
return (string) $from_array[1];
}
/**
* Transform MS ADODB Enum into php readable string
*
* @param object $column column item
* @access privat
* @return string empty string or the name type of column
*/
function _getFlags4TableInfo($column)
{
$this->pushErrorHandling(PEAR_ERROR_RETURN);
$ret = '';
if ($column->Properties->Count() > 0) {
$property = @$column->Properties('Nullable');
$ret .= (string) (@$property->Value == false) ? 'not_null' : '';
$property = @$column->Properties('Autoincrement');
$ret .= (string) (@$property->Value == true) ? 'auto_increment' : '';
$property = @$column->Properties('Primary Key');
$ret .= (string) (@$property->Value == true) ? 'primary_key' : '';
$property = @$column->Properties('Unique');
$ret .= (string) (@$property->Value == true) ? 'unique' : '';
}
$this->popErrorHandling();
$property = null;
unset($property);
return $ret;
}
/**
* Returns ADODB version
*
* @access (public)
* @return string ADODB version
*/
function getVersion()
{
if (is_object($this->connection)) {
return (string) $this->connection->Version;
}
return '';
}
/**
* Returns ADODB Provider
*
* @access (public)
* @return string ADODB version
*/
function getProvider()
{
if (is_object($this->connection)) {
return (string) $this->connection->Provider;
}
return '';
}
/**
* Checks if field is a binary type
*
* @param integer $value fieldtype
* @access public
* @return boolean TRUE on match, FALSE if other type
*/
function isTypeOfBinary($value)
{
if ($value == adBinary || $value == adVarBinary ||
$value == adLongVarBinary) {
return true;
}
return false;
}
/**
* Checks if field is a bit type
*
* @param integer $value fieldtype
* @access public
* @return boolean TRUE on match, FALSE if other type
*/
function isTypeOfBit($value)
{
if ($value == adBoolean) {
return true;
}
return false;
}
/**
* Checks if field is a char type
*
* @param integer $value fieldtype
* @access public
* @return boolean TRUE on match, FALSE if other type
*/
function isTypeOfChar($value)
{
if ($value == adChar || $value == adVarChar ||
$value == adWChar || $value == adVarWChar ||
$value == adLongVarChar || $value == adLongVarWChar) {
return true;
}
return false;
}
/**
* Checks if field is a date type
*
* @param integer $value fieldtype
* @access public
* @return boolean TRUE on match, FALSE if other type
*/
function isTypeOfDate($value)
{
if ($value == adDate || $value == adDBDate) {
return true;
}
return false;
}
/**
* Checks if field is a decimal type
*
* @param integer $value fieldtype
* @access public
* @return boolean TRUE on match, FALSE if other type
*/
function isTypeOfDecimal($value)
{
if ($value == adNumeric) {
return true;
}
return false;
}
/**
* Checks if field is a numeric type
*
* @param integer $value fieldtype
* @access public
* @return boolean TRUE on match, FALSE if other type
*/
function isTypeOfNumeric($value)
{
if ($value == adNumeric) {
return true;
}
return false;
}
/**
* Checks if field is a double type
*
* @param integer $value fieldtype
* @access public
* @return boolean TRUE on match, FALSE if other type
*/
function isTypeOfDouble($value)
{
if ($value == adDouble) {
return true;
}
return false;
}
/**
* Checks if field is a float type
*
* @param integer $value fieldtype
* @access public
* @return boolean TRUE on match, FALSE if other type
*/
function isTypeOfFloat($value)
{
if ($value == adSingle) {
return true;
}
return false;
}
/**
* Checks if field is a real type
*
* @param integer $value fieldtype
* @access public
* @return boolean TRUE on match, FALSE if other type
*/
function isTypeOfReal($value)
{
if ($value == adSingle) {
return true;
}
return false;
}
/**
* Checks if field is a integer type
*
* @param integer $value fieldtype
* @access public
* @return boolean TRUE on match, FALSE if other type
*/
function isTypeOfInteger($value)
{
if ($value == adInteger || $value == adSmallInt ||
$value == adUnsignedTinyInt) {
return true;
}
return false;
}
/**
* Checks if field is a currency type
* (which is not supported by php)
*
* @param integer $value fieldtype
* @access public
* @return boolean TRUE on match, FALSE if other type
*/
function isTypeOfCurrency($value)
{
if ($value == adCurrency) {
return true;
}
return false;
}
/**
* Checks if field is a time type
*
* @param integer $value fieldtype
* @access public
* @return boolean TRUE on match, FALSE if other type
*/
function isTypeOfTime($value)
{
if ($value == adDBTime) {
return true;
}
return false;
}
/**
* Checks if field is a timestamp type
*
* @param integer $value fieldtype
* @access public
* @return boolean TRUE on match, FALSE if other type
*/
function isTypeOfTimestamp($value)
{
if ($value == adDBTimeStamp) {
return true;
}
return false;
}
} // class DB_ado